import Vue from 'vue';
import VueRouter from 'vue-router';

// 进度条
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';

import store from '@/store/index';

import util from '@/utils/index.js';

// 路由数据
import routes from './routes';

Vue.use(VueRouter);
// 解决重复点击菜单报错 Uncaught (in promise) NavigationDuplicated{_name: "NavigationDuplicated", name: "NavigationDuplicated"}
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
  return originalPush.call(this, location).catch((err) => err);
};
// 导出路由 在 main.js 里使用
const router = new VueRouter({
  routes,
  scrollBehavior(to, from, savedPosition) {
    // 使用 keep-alive后 scrollBehavior 不起作用
    if (savedPosition) {
      return savedPosition;
    } else {
      // 跳转页面时置顶
      if (document.querySelector('.ui-container-full__body')) {
        document.querySelector('.ui-container-full__body').scrollTop = 0;
      }
      if (document.querySelector('.ui-theme-container-main')) {
        document.querySelector('.ui-theme-container-main').scrollTop = 0;
      }
    }
  },
});

/**
 * 路由拦截
 * 权限验证
 */

router.beforeEach(async (to, from, next) => {
  // 进度条
  NProgress.start();
  // 关闭搜索面板
  store.commit('vxadmin/search/set', false);
  const toName = to.name || '';

  if (toName === '404') {
    return next();
  }

  if (to.meta.skipAuth) {
    next();
  } else {
    /* 这里暂时将cookie里是否存有token作为验证是否登录的条件,请根据自身业务需要修改*/
    const token = util.cookies.get('token');
    if (token && token !== 'undefined') {
      store.dispatch('vxadmin/menu/loadMenu').then((menu) => {
        // 如果清除localStorage的话,走这个逻辑
        if (!menu) {
          next({
            name: 'login',
            query: {
              redirect: to.fullPath,
            },
          });
        } else {
          next();
        }
      });
    } else {
      /* 没有登录的时候跳转到登录界面, 携带上登陆成功之后需要跳转的页面完整路径*/
      next({
        name: 'login',
        query: {
          redirect: to.fullPath,
        },
      });
    }
  }
  // issues/138
  NProgress.done();
  // 判断是否跳过流程控制
  if (!to.query.toFlag) {
    businessControl(to, from, next);
  }
  next();
});

// 判断数组中是否有相同的value
function findKey(obj1, obj2) {
  // 如果business未定义，直接跳过判断
  if (!obj1 || !obj2) {
    return null;
  } else {
    return Object.keys(obj1).find((item) => {
      return Object.keys(obj2).indexOf(item) !== -1;
    });
  }
}
// 同一流程
function sameBusiness(to, from, next, besinessName) {
  // 保存该流程下的第一个流程页
  if (from.meta.business[besinessName] === 0) {
    sessionStorage.setItem('businessStartPath', from.name);
  }
  if (from.meta.business[besinessName] !== 'END' && to.meta.business[besinessName] !== 'END') {
    // 查询页进入录入页时，不缓存
    if (to.name.endsWith('Pre') && from.name.endsWith('Qry')) {
      to.meta.keepAlive = false;
    }
    // 如果不是按照流程顺序来进行执行，路由跳转时，限制回from的页面
    const code = to.meta.business[besinessName] - from.meta.business[besinessName];
    if (code !== 0 && Math.abs(code) !== 1) {
      NProgress.done();
      //拦截到from页面
      next({ name: from.name });
    }
  } else if (from.meta.business[besinessName] === 'END' && to.meta.business[besinessName] !== 0) {
    // 同一流程下结果页只能跳转到该流程的第一个流程页
    next({ name: sessionStorage.getItem('businessStartPath') });
  }
}
// 流程控制
function businessControl(to, from, next) {
  // 如果进入某一交易流程
  const besinessName = findKey(from.meta.business, to.meta.business);
  if (besinessName) {
    sameBusiness(to, from, next, besinessName);
  } else if (from.path !== '/' && to.meta.business && Object.values(to.meta.business).indexOf(0) < 0) {
    //限制从别的页面或者流程跳转时，只能跳转至该流程的第一个流程页
    next({ name: from.name });
  }
  next();
}

router.afterEach((to) => {
  // 进度条
  NProgress.done();

  // 不打开新页签，在当前页签展示 add by lss
  if (!to.meta.close) {
    // 多页控制 打开新的页面
    store.dispatch('vxadmin/page/open', to);
  }

  // 更改标题
  util.title();
});

export default router;
